﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using General;

namespace TVLL5A
{
    public class HabilidadesL5A
    {
        private AtributosL5A toAtributoL5A(string atr)
        {
            if (atr == "Resistencia")
            {
                return AtributosL5A.Resistencia;
            }

            if (atr == "Voluntad")
            {
                return AtributosL5A.Voluntad;
            }

            if (atr == "Fuerza")
            {
                return AtributosL5A.Fuerza;
            }

            if (atr == "Percepcion")
            {
                return AtributosL5A.Percepcion;
            }

            if (atr == "Agilidad")
            {
                return AtributosL5A.Agilidad;
            }

            if (atr == "Inteligencia")
            {
                return AtributosL5A.Inteligencia;
            }

            if (atr == "Reflejos")
            {
                return AtributosL5A.Reflejos;
            }

            if (atr == "Consciencia")
            {
                return AtributosL5A.Consciencia;
            }

            return AtributosL5A.Vacio;
        }
        private const string _rutaxsd = "../../../TVLL5A/HabilidadL5A.xsd";

        private string _fallo;
        public string Fallo
        {
            get { return this._fallo; }
        }

        private string _Nombre;
        public string Nombre
        {
            get
            {
                return this._Nombre;
            }
            set
            {
                this._Nombre = value;
            }
        }

        private int _Rango;
        public int Rango
        {
            get
            {
                return this._Rango;
            }
            set
            {
                this._Rango = value;
            }
        }

        private string _Descripcion;
        public string Descripcion
        {
            get
            {
                return this._Descripcion;
            }
            set
            {
                this._Descripcion = value;
            }
        }

        private AtributosL5A _Atributo;
        public AtributosL5A Atributo
        {
            get
            {
                return this._Atributo;
            }
            set
            {
                this._Atributo = value;
            }
        }

        public HabilidadesL5A()
        {
            _Nombre = "";
            _Rango = 1;
            _Descripcion = "";
            _Atributo = AtributosL5A.Agilidad;
            _fallo = "No";
        }
        public HabilidadesL5A(string N, int R, string D,AtributosL5A A)
        {
            _Nombre = N;
            _Rango = R;
            _Descripcion = D;
            _Atributo = A;
            _fallo = "No";
        }
        public HabilidadesL5A(string ruta)
        {
            _fallo = "No";
            this.cargar(ruta);
        }
        public HabilidadesL5A(XmlElement nodo)
        {
            _fallo = "No";
            this.cargar(nodo);
        }

        public void toXTVL(XmlTextWriter mixml)
        {
            mixml.WriteStartElement("habilidad");
            mixml.WriteElementString("nombre", this.Nombre);
            mixml.WriteElementString("rango", this.Rango.ToString());
            mixml.WriteElementString("desc", this.Descripcion);
            mixml.WriteElementString("atributo", this.Atributo.ToString());
            mixml.WriteEndElement();
        }

        public bool guardar(string ruta)
        {
            XmlTextWriter mixml = new XmlTextWriter(ruta, System.Text.Encoding.UTF8);
            mixml.Formatting = System.Xml.Formatting.Indented;
            mixml.WriteStartDocument();
            this.toXTVL(mixml);
            mixml.WriteEndDocument();
            mixml.Close();
            XSDValidator validador = new XSDValidator(_rutaxsd, ruta);
            if (validador.validar())
            {
                this._fallo = validador.Fallo;
                return true;
            }
            else
            {
                if (System.IO.File.Exists(ruta))
                {
                    System.IO.File.Delete(ruta);
                }
                return false;
            }
        }

        public bool cargar(string ruta)
        {
            XSDValidator validador = new XSDValidator(_rutaxsd, ruta);
            if (!validador.validar())
            {
                this._fallo = validador.Fallo;
                return false;
            }
            else
            {
                XmlDocument xtvl = new XmlDocument();
                xtvl.Load(ruta);
                XmlNodeList nombre = xtvl.GetElementsByTagName("nombre");
                XmlNodeList desc = xtvl.GetElementsByTagName("desc");
                XmlNodeList atr = xtvl.GetElementsByTagName("atributo");
                XmlNodeList rng = xtvl.GetElementsByTagName("rango");
                Nombre = nombre[0].InnerText;
                Descripcion = desc[0].InnerText;
                Atributo = this.toAtributoL5A(atr[0].InnerText);
                Rango = Convert.ToInt32(rng[0].InnerText);
                return true;
            }
        }

        public bool cargar(XmlElement nodo)
        {
            try
            {
                XmlNodeList nombre = nodo.GetElementsByTagName("nombre");
                XmlNodeList desc = nodo.GetElementsByTagName("desc");
                XmlNodeList atr = nodo.GetElementsByTagName("atributo");
                XmlNodeList rng = nodo.GetElementsByTagName("rango");
                Nombre = nombre[0].InnerText;
                Descripcion = desc[0].InnerText;
                Atributo = this.toAtributoL5A(atr[0].InnerText);
                Rango = Convert.ToInt32(rng[0].InnerText);
                return true;
            }
            catch (Exception ex)
            {
                this._fallo = ex.Message;
                return false;
            }
        }
    }
}
